package com.szj.father.reflect;

import com.szj.father.entity.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;

/**
 * @author ：shenzhuojun
 * @date ：Created in 2021/9/6 17:00
 * @description：反射的一些用法
 */
public class ReflectTest {

    public static void main(String[] args) throws Exception {

        // 获取class的几种方法
        // 方式一：通过运行时类的属性.class
        Class<User> class1 = User.class;

        // 方式二：通过运行时类的对象的getClass()方法
        User user = new User();
        Class<? extends User> class2 = user.getClass();

        // 方式三：通过Class的静态方法——forName(String className) throws ClassNotFoundException
        Class<?> class3 = Class.forName("com.szj.father.entity.User");
    }
    public Object copy(Object obj) throws Exception {
        // 获取class的几种方法
        // 方式一：通过运行时类的属性.class
        Class<User> userClass = User.class;

        // 方式二：通过运行时类的对象的getClass()方法
        Class classType = obj.getClass();

        // 调用无参构造方法创建对象
        Object o1 = classType.newInstance();
        // 通过默认构造方法创建一个新的对象
        Constructor con = classType.getDeclaredConstructor(String.class, Integer.class, Date.class);
        Object o2 = con.newInstance("jack", 20, new Date());

        // 获得对象的所有属性
        Field[] fields = classType.getDeclaredFields();

        // 获得和属性对应的getXXX()、setXXX()方法的名字
        for (Field field : fields) {
            // name
            String fieldName = field.getName();
            // name -> N
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            // getName
            String getMethodName = "get" + firstLetter + fieldName.substring(1);
            // setName
            String setMethodName = "set" + firstLetter + fieldName.substring(1);

        }

        return null;

    }
}
